const fs = require("fs");
const path = require("path");

/**
 * 在Vue项目的public目录下创建海报图片文件夹的符号链接或复制图片
 */
function setupMoviePosters() {
    console.log("=".repeat(60));
    console.log("电影海报图片设置工具");
    console.log("=".repeat(60));

    // 定义源文件夹和目标文件夹
    const sourceFolders = {
        douban_images: path.resolve(__dirname, "douban_images"),
        maoyan_images: path.resolve(__dirname, "maoyan_images"),
    };

    const targetDir = path.resolve(__dirname, "vue-dashboard/public");

    // 显示源文件夹和目标文件夹的路径
    console.log("源文件夹路径:");
    for (const [name, folder] of Object.entries(sourceFolders)) {
        console.log(`- ${name}: ${folder}`);
        if (fs.existsSync(folder)) {
            const files = fs.readdirSync(folder);
            console.log(`  存在: 包含 ${files.length} 个文件`);
            if (files.length > 0) {
                console.log(`  示例: ${files.slice(0, 3).join(", ")}${files.length > 3 ? "..." : ""}`);
            }
        } else {
            console.log(`  不存在!`);
        }
    }

    console.log("\n目标目录:", targetDir);

    // 确保目标目录存在
    if (!fs.existsSync(targetDir)) {
        fs.mkdirSync(targetDir, { recursive: true });
        console.log(`创建目录: ${targetDir}`);
    } else {
        console.log(`目标目录已存在`);
    }

    // 尝试为每个源文件夹创建符号链接
    let allSuccess = true;

    for (const [folderName, sourcePath] of Object.entries(sourceFolders)) {
        const targetPath = path.join(targetDir, folderName);

        // 检查源文件夹是否存在
        if (!fs.existsSync(sourcePath)) {
            console.log(`警告: 源文件夹不存在: ${sourcePath}`);
            console.log("跳过此文件夹");
            continue;
        }

        console.log(`\n处理 ${folderName}...`);

        // 如果目标已存在，先删除
        if (fs.existsSync(targetPath)) {
            try {
                const stats = fs.lstatSync(targetPath);
                if (stats.isSymbolicLink()) {
                    fs.unlinkSync(targetPath);
                    console.log(`- 已删除现有符号链接: ${targetPath}`);
                } else if (stats.isDirectory()) {
                    console.log(`- 目标已存在，跳过: ${targetPath}`);
                    continue;
                }
            } catch (err) {
                console.error(`- 删除现有链接失败: ${err.message}`);
                allSuccess = false;
                continue;
            }
        }

        // 尝试创建符号链接
        try {
            // 在Windows上使用绝对路径，在Linux/Mac上使用相对路径
            const relativeSourcePath = path.relative(targetDir, sourcePath);
            const linkType = process.platform === "win32" ? "junction" : "dir";

            console.log(`- 创建链接类型: ${linkType}`);
            console.log(`- 源路径: ${process.platform === "win32" ? sourcePath : relativeSourcePath}`);
            console.log(`- 目标路径: ${targetPath}`);

            fs.symlinkSync(process.platform === "win32" ? sourcePath : relativeSourcePath, targetPath, linkType);

            console.log(`✓ 成功创建链接: ${targetPath} -> ${sourcePath}`);
        } catch (err) {
            console.error(`✗ 创建链接失败: ${err.message}`);
            allSuccess = false;

            if (process.platform === "win32" && err.code === "EPERM") {
                console.log("  提示: 在Windows上，创建符号链接可能需要管理员权限");
            }

            // 如果创建链接失败，复制整个目录
            console.log("  尝试复制文件夹作为备选方案...");
            copyFolderRecursive(sourcePath, targetPath);
        }
    }

    if (allSuccess) {
        console.log("\n所有符号链接创建成功！");
    } else {
        console.log("\n部分操作失败，但已尝试使用复制作为备选方案。");
    }

    console.log("\n现在可以正常访问电影海报:");
    console.log("1. 启动Vue项目：cd vue-dashboard && npm run dev");
    console.log("2. 查看带有海报的电影列表");

    // 检查目标目录中的文件
    console.log("\n检查目标目录状态:");
    for (const folderName of Object.keys(sourceFolders)) {
        const targetPath = path.join(targetDir, folderName);
        if (fs.existsSync(targetPath)) {
            try {
                const stats = fs.lstatSync(targetPath);
                if (stats.isSymbolicLink()) {
                    const linkTarget = fs.readlinkSync(targetPath);
                    console.log(`- ${folderName}: 符号链接，指向 ${linkTarget}`);
                } else if (stats.isDirectory()) {
                    const files = fs.readdirSync(targetPath);
                    console.log(`- ${folderName}: 目录，包含 ${files.length} 个文件`);
                    if (files.length > 0) {
                        console.log(`  示例: ${files.slice(0, 3).join(", ")}${files.length > 3 ? "..." : ""}`);
                    }
                }
            } catch (err) {
                console.error(`- ${folderName}: 检查失败 - ${err.message}`);
            }
        } else {
            console.log(`- ${folderName}: 不存在!`);
        }
    }

    console.log("=".repeat(60));
}

/**
 * 递归复制文件夹
 */
function copyFolderRecursive(source, target) {
    // 确保目标目录存在
    if (!fs.existsSync(target)) {
        fs.mkdirSync(target, { recursive: true });
    }

    // 读取源目录
    const files = fs.readdirSync(source);
    const imageExtensions = [".jpg", ".jpeg", ".png", ".gif", ".webp"];
    let copiedCount = 0;

    // 复制每个文件
    for (const file of files) {
        const sourcePath = path.join(source, file);
        const targetPath = path.join(target, file);

        // 获取文件状态
        const stats = fs.statSync(sourcePath);

        if (stats.isFile()) {
            // 只复制图片文件
            const ext = path.extname(file).toLowerCase();
            if (imageExtensions.includes(ext)) {
                fs.copyFileSync(sourcePath, targetPath);
                copiedCount++;

                // 每复制50个文件输出一次进度
                if (copiedCount % 50 === 0) {
                    process.stdout.write(`  已复制 ${copiedCount} 个文件...\r`);
                }
            }
        } else if (stats.isDirectory()) {
            // 递归复制子目录
            copyFolderRecursive(sourcePath, targetPath);
        }
    }

    if (copiedCount > 0) {
        console.log(`  ✓ 已复制 ${copiedCount} 个图片文件到 ${target}`);
    } else {
        console.log(`  ! 未找到图片文件在 ${source}`);
    }
}

// 执行函数
setupMoviePosters();
